﻿using System;
using System.Diagnostics;
using System.Threading;

namespace MathService
{
    /// <summary>Наблюдатель за объектом</summary>
    /// <typeparam name="T">Тип наблюдаемого объекта</typeparam>
    public class ObjectWacher<T> : Processor
    {
        /* ------------------------------------------------------------------------------------------ */



        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Наблюдаемый объект</summary>
        private T f_Object;

        /// <summary>Метод наблюдения</summary>
        private Action<T> f_WachMethod;

        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Метод наблюдения</summary>
        public Action<T> WachMethod
        {
            [DebuggerStepThrough]
            get { return f_WachMethod; }
            [DebuggerStepThrough]
            set { f_WachMethod = value; }
        }

        /// <summary>Наблюдаемый объект</summary>
        public T Object
        {
            [DebuggerStepThrough]
            get { return f_Object; }
            [DebuggerStepThrough]
            set { f_Object = value; }
        }

        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Инициализация наблюдателя</summary>
        /// <param name="obj">Наблюдаемый объект</param>
        /// <param name="WachMethod">Метод наблюдения</param>
        /// <param name="Timeout">Таймаут потока наблюдения</param>
        [DebuggerStepThrough]
        public ObjectWacher(T obj, Action<T> WachMethod, int Timeout = 0)
        {
            f_Object = obj;
            f_WachMethod = WachMethod;
            ActionTimeout = Timeout;
        }

        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Основной метод действия процессора, вызываемое в цикле. Должно быть переопределено в классах-наследниках</summary>
        protected override void MainAction()
        {
            var lv_WachMethod = f_WachMethod;
            var timeout = ActionTimeout;

            if(lv_WachMethod != null) lv_WachMethod(f_Object);
            if(timeout > 0) Thread.Sleep(timeout);
        }

        /* ------------------------------------------------------------------------------------------ */
    }
}
